最多能创建多少个 TCP 连接?
The following article is from 低并发编程 Author 闪客
作者丨闪客sun
端口号
过了一分钟,我又去找老操了。"老操,我要建立一个 TCP 连接!"老操不慌不忙,拿出一个表格递给我,"小进,先填表吧"[root]# cat /proc/sys/net/ipv4/ip_local_port_range
1024 65000
"看到没,当前的限制是1024~65000,所以你就只能有63977个端口号可以使用。"net.ipv4.ip_local_port_range = 60000 60009
"保存好后执行 sysctl -p /etc/sysctl.conf 使其生效。这样你就只有 10 个端口号可以用了,就会更快报出端口号不够用的错误""原来如此,谢谢老操又给我上了一课。"哎不对,建立一个 TCP 连接,需要将通信两端的套接字(socket)进行绑定,如下:源 IP 地址:源端口号 <----> 目标 IP 地址:目标端口号只要这套绑定关系构成的四元组不重复即可,刚刚端口号不够用了,是因为我一直对同一个目标IP和端口建立连接,那我换一个目标端口号试试。文件描述符
找到了突破端口号限制的办法,我不断找老操建立TCP连接,老操也拿我没有办法。直到有一次,我又收到了一张特殊的纸条,上面写的不是文件描述符。系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看
用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看
进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看[root ~]# cat /proc/sys/fs/file-max
100000
[root ~]# cat /proc/sys/fs/nr_open
100000
[root ~]# cat /etc/security/limits.conf
...
* soft nproc 100000
* hard nproc 100000
原来如此,我记得刚刚收到的最后一张纸条是。echo 100 > /proc/sys/fs/nr_open
"原来如此,我这就去把各种文件描述符限制都改大一点,也不多,就在后面加个0吧""额,早知道不告诉你小子了。"老操再次用鄙视的眼睛看着我。 线程
突破了文件描述符限制,我又开始肆无忌惮地创建起了TCP连接。但我发现,老操的办事效率越来越慢,建立一个TCP连接花的时间越来越久。有一次,我忍不住责问老操,"你是不是在偷懒啊?之前找你建一个TCP连接就花不到一分钟时间,你看看最近我哪次不是等一个多小时你才搞好?"老操也忍不住了,"小进啊你还好意思说我,你知不知道你每建一个TCP连接都需要消耗一个线程来为你服务?现在我和CPU老大那里都忙得不可开交了,一直在为你这好几十万个线程不停地进行上下文切换,我们精力有限啊,自然就没法像以前那么快为你服务了。"内存
突破了端口号、文件描述符、线程数等重重限制的我,再次肆无忌惮地创建起了TCP连接。直到有一次,我又收到了一张红牌。CPU
有了老操为我争取的内存资源,我又开始日以继日地创建TCP连接。老操也不再说什么,同样日以继日地执行着我的指令。有一次,老操语重心长地对我说,"差不多了,我劝你就此收手吧,现在 CPU 的占用率已经快到 100% 了。"总结
资源 | 一台Linux服务器的资源 | 一个TCP连接占用的资源 | 占满了会发生什么 |
CPU | 看你花多少钱买的 | 看你用它干嘛 | 电脑卡死 |
内存 | 看你花多少钱买的 | 取决于缓冲区大小 | OOM |
临时端口号 | ip_local_port_range | 1 | cannot assign requested address |
文件描述符 | fs.file-max | 1 | too many open files |
进程\线程数 | ulimit -n | 看IO模型 | 系统崩溃 |
后记
后记
其实这个问题,我觉得结论不重要,最重要的是思考过程。
而思考过程其实相当简单,就是,寻找限制条件而已,其实一开始这篇文章,我写了个故事在开头,但后来感觉放在后记更合适。故事是这样的。
闪客:小宇,我问你,你一天最多能吃多少个汉堡?
小宇:额,你这问的太隐私了吧,不过看在你教我技术的份上,我就告诉你,最多能吃 4 个左右吧。
闪客:咳咳真的么?好吧,那你一分钟最多能吃多少个汉堡?
小宇:快的话可能 2 个,不过正常应该最多就能吃完 1 个了。
闪客:好的,那我问你,刚刚这两个问题你为什么能不假思索地回答出来呢?
小宇:哈哈你这是什么话,我自己我当然了解了。
闪客:不,你仔细想想你回答这两个问题的逻辑。
小宇:哦我明白你的意思了,当你问我一天最多能吃多少个汉堡时,我考虑的是我的胃的容量最多能容下多少个汉堡。而当你问我一分钟最多能吃多少个汉堡时,我考虑的时我吃汉堡的速度,按照这个速度在一分钟内能吃多少。
闪客:没错,你总结得很好!一天最多吃多少个汉堡,此时时间非常充裕,所以主要是胃的容量限制了这个汉堡最大值,计算公式应该是:
最多汉堡数 = 胃的容量 ÷ 汉堡的体积
而一分钟最多吃多少个汉堡,此时胃的容量非常充裕,限制汉堡最大值的是时间因素,计算公式是:
最多汉堡数 = 一分钟 ÷ 吃一个汉堡的耗时
所以,取决于最先触达的那个限制条件。
而最大 TCP 连接数这个问题,假如面试被问到了,即使你完全不会,也应该有这样的思路。
而如果你有了这样的思路,你多多少少都能回答出让面试官满意的答案,因为计算机很多时候,更看重思路,而不是细枝末节。
2、为写论文,华人学者向Linux提交200多条「恶意代码」,结果整个大学都被Linux封了
3、他是阿里技术大神,23岁成为最年轻专家,马云离开他睡不安稳!
4、一图看懂2021年春季发布会:苹果发布紫色iPhone12、新iPad Pro等
识别关注我们
了解更多精彩内容
点分享
点点赞
点在看